import 'package:encrypt/encrypt.dart' as Encrypt;
import 'package:encrypt/encrypt.dart';

import '../constant/security_constant.dart';

/**
    AES加密的五种模式
    ECB(Electronic Codebook Book) 电码本模式
    将明文分成若干段相同的小段, 不足补齐, 然后依次对每一小段进行加密后输出密文. ECB模式的弱点在于, 相同的明文会产生相同的密文, 容易遭到字典攻击, 安全性不够高

    CBC(Cipher Block Chaining) 密码分组链接模式
    先明文切分成若干小段, 每一小段与初始块或者上一段的密文段进行异或运算后, 再与密钥进行加密, 这样做的目的是增强破解难度. 相对于ECB模式来说, CBC模式较安全, 同时CBC适合于传输长度较长的报文

    CTR(Counter) 计算器模式
    在CTR模式中有一个自增的算子, 这个算子用密钥加密之后的输出和明文异或的结果得到密文, 相当于一次一密. 这种加密方式简单快速安全可靠, 而且可以并行加密. 但是在计算器不能维持很长的情况下, 密钥只能使用一次

    CFB(Cipher FeedBack) 密码反馈模式

    OFB(Output FeedBack) 输出反馈模式
 */

class EncryptUtils {
  ///aes加密函数
  static String aesEncode(String content) {
    //加密key
    final key = Encrypt.Key.fromUtf8(SecurityConstant.aesKey);
    //偏移量
    final iv = Encrypt.IV.fromUtf8(SecurityConstant.aesIv);

    //设置cbc模式  PKCS5PADDING
    final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: 'PKCS7'));
    ;
    //加密
    final encrypted = encrypter.encrypt(content, iv: iv);
    //解密
    final decrypted = encrypter.decrypt(encrypted, iv: iv);

    return encrypted.base64;
  }

  /// 解密函数
  static String aesDecrypted(String data) {
    //加密key
    final key = Encrypt.Key.fromUtf8(SecurityConstant.aesKey);
    //偏移量
    final iv = Encrypt.IV.fromUtf8(SecurityConstant.aesIv);

    //设置cbc模式
    final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: 'PKCS7'));

    return encrypter.decrypt(Encrypted.fromBase64(data), iv: iv);
  }
}
